Micron Document
🌎 rns.kin.earth git 🌍

Node / dev / reticulum / files / RNS / Interfaces / AutoInterface.py

Displaying Raw • Download

RNS/Interfaces/AutoInterface.py 9d924dcd6d7d07bbcbf3d2d083a007d2f49a2afb (9d924dcd) Text, 24.80 KB

T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2024 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.

Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72import T7ee787socketserver
Tff7b72import T7ee787threading
Tff7b72import T7ee787re
Tff7b72import T7ee787socket
Tff7b72import T7ee787struct
Tff7b72import T7ee787time
Tff7b72import T7ee787sys
Tff7b72import T7ee787RNS


Tff7b72class T56d364AutoInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3DEFAULT_DISCOVERY_PORT Tff7b72= T79c0ff29716
Te6edf3DEFAULT_DATA_PORT Tff7b72= T79c0ff42671
Te6edf3DEFAULT_GROUP_ID Tff7b72= Ta5d6ff"Ta5d6ffreticulumTa5d6ff"Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16

Te6edf3SCOPE_LINK Tff7b72= Ta5d6ff"Ta5d6ff2Ta5d6ff"
Te6edf3SCOPE_ADMIN Tff7b72= Ta5d6ff"Ta5d6ff4Ta5d6ff"
Te6edf3SCOPE_SITE Tff7b72= Ta5d6ff"Ta5d6ff5Ta5d6ff"
Te6edf3SCOPE_ORGANISATION Tff7b72= Ta5d6ff"Ta5d6ff8Ta5d6ff"
Te6edf3SCOPE_GLOBAL Tff7b72= Ta5d6ff"Ta5d6ffeTa5d6ff"

Te6edf3MULTICAST_PERMANENT_ADDRESS_TYPE Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3MULTICAST_TEMPORARY_ADDRESS_TYPE Tff7b72= Ta5d6ff"Ta5d6ff1Ta5d6ff"

Te6edf3PEERING_TIMEOUT Tff7b72= T79c0ff7.5

Te6edf3ALL_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4]
Te6edf3DARWIN_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffawdl0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffllw0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffen5Ta5d6ff"Tb4b4b4]
Te6edf3ANDROID_IGNORE_IFS Tff7b72= Tb4b4b4[Ta5d6ff"Ta5d6ffdummy0Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffloTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftun0Ta5d6ff"Tb4b4b4]

Te6edf3BITRATE_GUESS Tff7b72= T79c0ff10Tff7b72*T79c0ff1000Tff7b72*T79c0ff1000

Te6edf3MULTI_IF_DEQUE_LEN Tff7b72= T79c0ff48
Te6edf3MULTI_IF_DEQUE_TTL Tff7b72= T79c0ff0.75

Tff7b72def Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffcreate_handlerTb4b4b4(Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3AutoInterfaceHandlerTb4b4b4(Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)
Tff7b72return Te6edf3create_handler

Tff7b72def Td2a8ffdescope_linklocalTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3link_local_addrTb4b4b4)Tb4b4b4:
T8b949e# Drop scope specifier expressd as %ifname (macOS)
Te6edf3link_local_addr Tff7b72= Te6edf3link_local_addrTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff%Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]
T8b949e# Drop embedded scope specifier (NetBSD, OpenBSD)
Te6edf3link_local_addr Tff7b72= Te6edf3reTff7b72.Td2a8ffsubTb4b4b4(Ta5d6ffrTa5d6ff"Ta5d6fffe80:[0-9a-f]*::Ta5d6ff"Tb4b4b4,Ta5d6ff"Ta5d6fffe80::Ta5d6ff"Tb4b4b4, Te6edf3link_local_addrTb4b4b4)
Tff7b72return Te6edf3link_local_addr

Tff7b72def Td2a8fflist_interfacesTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3ifs Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterfacesTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3ifs

Tff7b72def Td2a8fflist_addressesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Te6edf3ifas Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffifaddressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72return Te6edf3ifas

Tff7b72def Td2a8ffinterface_name_to_indexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:

T8b949e# socket.if_nametoindex doesn't work with uuid interface names on windows, it wants the ethernet_0 style
T8b949e# we will just get the index from netinfo instead as it seems to work
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_names_to_indexesTb4b4b4(Tb4b4b4)Tb4b4b4[Te6edf3ifnameTb4b4b4]

Tff7b72return Te6edf3socketTff7b72.Td2a8ffif_nametoindexTb4b4b4(Te6edf3ifnameTb4b4b4)

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4)Tb4b4b4:
Te6edf3c Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)
Te6edf3name Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]
Te6edf3group_id Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffgroup_idTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffgroup_idTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3discovery_scope Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_scopeTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3discovery_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdiscovery_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3multicast_address_type Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffmulticast_address_typeTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3data_port Tff7b72= Tffa657intTb4b4b4(Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffdata_portTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdata_portTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3allowed_interfaces Tff7b72= Te6edf3cTff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffdevicesTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffdevicesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3ignored_interfaces Tff7b72= Te6edf3cTff7b72.Td2a8ffas_listTb4b4b4(Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff"Tb4b4b4) Tff7b72if Ta5d6ff"Ta5d6ffignored_devicesTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None
Te6edf3configured_bitrate Tff7b72= Te6edf3cTb4b4b4[Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff"Tb4b4b4] Tff7b72if Ta5d6ff"Ta5d6ffconfigured_bitrateTa5d6ff" Tff7b72in Te6edf3c Tff7b72else Tff7b72None

Tff7b72from T7ee787RNST7ee787.T7ee787vendorT7ee787.T7ee787ifaddr Tff7b72import Te6edf3niwrapper
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffnetinfo Tff7b72= Te6edf3niwrapper

Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff1064

Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpeers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fflink_local_addresses Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffadopted_interfaces Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffinterface_servers Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffmulticast_echoes Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ffmif_deque Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_LENTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmif_deque_times Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_LENTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72False

Tff7b72selfTff7b72.Td2a8ffoutbound_udp_socket Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffannounce_rate_target Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffannounce_interval Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEERING_TIMEOUTTff7b72/T79c0ff6.0
Tff7b72selfTff7b72.Td2a8ffpeer_job_interval Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEERING_TIMEOUTTff7b72*T79c0ff1.1
Tff7b72selfTff7b72.Td2a8ffpeering_timeout Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEERING_TIMEOUT
Tff7b72selfTff7b72.Td2a8ffmulticast_echo_timeout Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffPEERING_TIMEOUTTff7b72/T79c0ff2

T8b949e# Increase peering timeout on Android, due to potential
T8b949e# low-power modes implemented on many chipsets.
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeering_timeout Tff7b72*Tff7b72= T79c0ff3

Tff7b72if Te6edf3allowed_interfaces Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffallowed_interfaces Tff7b72= Te6edf3allowed_interfaces

Tff7b72if Te6edf3ignored_interfaces Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffignored_interfaces Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffignored_interfaces Tff7b72= Te6edf3ignored_interfaces

Tff7b72if Te6edf3group_id Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffgroup_id Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_GROUP_ID
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffgroup_id Tff7b72= Te6edf3group_idTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Tff7b72if Te6edf3discovery_port Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_port Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_DISCOVERY_PORT
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_port Tff7b72= Te6edf3discovery_port

Tff7b72if Te6edf3multicast_address_type Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3multicast_address_typeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftemporaryTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3multicast_address_typeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffpermanentTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_PERMANENT_ADDRESS_TYPE
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_address_type Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTICAST_TEMPORARY_ADDRESS_TYPE

Tff7b72if Te6edf3data_port Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata_port Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffDEFAULT_DATA_PORT
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdata_port Tff7b72= Te6edf3data_port

Tff7b72if Te6edf3discovery_scope Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINK
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINK
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffadminTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_ADMIN
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffsiteTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_SITE
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fforganisationTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_ORGANISATION
Tff7b72elif Tffa657strTb4b4b4(Te6edf3discovery_scopeTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6ffglobalTa5d6ff"Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_GLOBAL

Tff7b72selfTff7b72.Td2a8ffgroup_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTb4b4b4)
Te6edf3g Tff7b72= Tff7b72selfTff7b72.Td2a8ffgroup_hash
T8b949e#gt = "{:02x}".format(g[1]+(g[0]<<8))
Te6edf3gt Tff7b72= Ta5d6ff"Ta5d6ff0Ta5d6ff"
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff3Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff2Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff5Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff4Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff7Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff6Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff9Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff8Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff11Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff10Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Te6edf3gt Tff7b72+Tff7b72= Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Ta5d6ff"Tffd700{:02x}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3gTb4b4b4[T79c0ff13Tb4b4b4]Tff7b72+Tb4b4b4(Te6edf3gTb4b4b4[T79c0ff12Tb4b4b4]Tff7b72<<T79c0ff8Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmcast_discovery_address Tff7b72= Ta5d6ff"Ta5d6ffffTa5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffmulticast_address_typeTff7b72+Tff7b72selfTff7b72.Td2a8ffdiscovery_scopeTff7b72+Ta5d6ff"Ta5d6ff:Ta5d6ff"Tff7b72+Te6edf3gt

Te6edf3suitable_interfaces Tff7b72= T79c0ff0
Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fflist_interfacesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffDARWIN_IGNORE_IFS Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Darwin AWDL or tethering interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_darwinTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72== Ta5d6ff"Ta5d6fflo0Ta5d6ff"Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Darwin loopback interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_androidTb4b4b4(Tb4b4b4) Tff7b72and Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffANDROID_IGNORE_IFS Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping Android system interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffignored_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff ignoring disallowed interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elif Te6edf3ifname Tff7b72in Te6edf3AutoInterfaceTff7b72.Td2a8ffALL_IGNORE_IFSTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff skipping interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72if Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4) Tff7b72> T79c0ff0 Tff7b72and Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffallowed_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff ignoring interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff since it was not allowedTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addresses Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_addressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6 Tff7b72in Te6edf3addressesTb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72None
Tff7b72for Te6edf3address Tff7b72in Te6edf3addressesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffaddrTa5d6ff" Tff7b72in Te6edf3addressTb4b4b4:
Tff7b72if Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffe80:Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffdescope_linklocalTb4b4b4(Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_local_addrTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3link_local_addr
Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3nice_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_name_to_nice_nameTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Te6edf3nice_name Tff7b72!= Tff7b72None Tff7b72and Te6edf3nice_name Tff7b72!= Te6edf3ifnameTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff Selecting link-local address Tffd700{Te6edf3link_local_addrTffd700}Ta5d6ff for interface Tffd700{Te6edf3nice_nameTffd700}Ta5d6ff / Tffd700{Te6edf3ifnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff Selecting link-local address Tffd700{Te6edf3link_local_addrTffd700}Ta5d6ff for interface Tffd700{Te6edf3ifnameTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)

Tff7b72if Te6edf3link_local_addr Tff7b72== Tff7b72NoneTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff No link-local IPv6 address configured for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, skipping interfaceTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3mcast_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffmcast_discovery_address
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Creating multicast discovery listener on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with address Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3mcast_addrTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_EXTREMETb4b4b4)

T8b949e# Struct with interface index
Te6edf3if_struct Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ffITa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)

T8b949e# Set up multicast socket
Te6edf3discovery_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEADDRTb4b4b4, T79c0ff1Tb4b4b4)
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3socketTb4b4b4, Ta5d6ff"Ta5d6ffSO_REUSEPORTTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffSOL_SOCKETTb4b4b4, Te6edf3socketTff7b72.Td2a8ffSO_REUSEPORTTb4b4b4, T79c0ff1Tb4b4b4)
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_MULTICAST_IFTb4b4b4, Te6edf3if_structTb4b4b4)

T8b949e# Join multicast group
Te6edf3mcast_group Tff7b72= Te6edf3socketTff7b72.Td2a8ffinet_ptonTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3mcast_addrTb4b4b4) Tff7b72+ Te6edf3if_struct
Te6edf3discovery_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_JOIN_GROUPTb4b4b4, Te6edf3mcast_groupTb4b4b4)

T8b949e# Bind socket
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffvendorTff7b72.Td2a8ffplatformutilsTff7b72.Td2a8ffis_windowsTb4b4b4(Tb4b4b4)Tb4b4b4:

T8b949e# window throws "[WinError 10049] The requested address is not valid in its context"
T8b949e# when trying to use the multicast address as host, or when providing interface index
T8b949e# passing an empty host appears to work, but probably not exactly how we want it to...
Te6edf3discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Tb4b4b4(Ta5d6ff'Ta5d6ff'Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4)Tb4b4b4)

Tff7b72elseTb4b4b4:

Tff7b72if Tff7b72selfTff7b72.Td2a8ffdiscovery_scope Tff7b72== Te6edf3AutoInterfaceTff7b72.Td2a8ffSCOPE_LINKTb4b4b4:
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3mcast_addrTff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Te6edf3ifnameTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3mcast_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)

Te6edf3discovery_socketTff7b72.Td2a8ffbindTb4b4b4(Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)

T8b949e# Set up thread for discovery packets
Tff7b72def Td2a8ffdiscovery_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdiscovery_handlerTb4b4b4(Te6edf3discovery_socketTb4b4b4, Te6edf3ifnameTb4b4b4)

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3discovery_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3suitable_interfaces Tff7b72+Tff7b72= T79c0ff1

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3nice_name Tff7b72= Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffinterface_name_to_nice_nameTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Te6edf3nice_name Tff7b72!= Tff7b72None Tff7b72and Te6edf3nice_name Tff7b72!= Te6edf3ifnameTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not configure the system interface Tffd700{Te6edf3nice_nameTffd700}Ta5d6ff / Tffd700{Te6edf3ifnameTffd700}Ta5d6ff for use with Tffd700{Tff7b72selfTffd700}Ta5d6ff, skipping it. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCould not configure the system interface Tffd700{Te6edf3ifnameTffd700}Ta5d6ff for use with Tffd700{Tff7b72selfTffd700}Ta5d6ff, skipping it. The contained exception was: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72if Te6edf3suitable_interfaces Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff could not autoconfigure. This interface currently provides no connectivity.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffreceives Tff7b72= Tff7b72True

Tff7b72if Te6edf3configured_bitrate Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3configured_bitrate
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= Te6edf3AutoInterfaceTff7b72.Td2a8ffBITRATE_GUESS

Te6edf3peering_wait Tff7b72= Tff7b72selfTff7b72.Td2a8ffannounce_intervalTff7b72*T79c0ff1.2
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff discovering peers for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tffa657roundTb4b4b4(Te6edf3peering_waitTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff seconds...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_VERBOSETb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Te6edf3socketserverTff7b72.Td2a8ffUDPServerTff7b72.Td2a8ffaddress_family Tff7b72= Te6edf3socketTff7b72.Td2a8ffAF_INET6

Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
Te6edf3local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3local_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3address Tff7b72= Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]

Te6edf3udp_server Tff7b72= Te6edf3socketserverTff7b72.Td2a8ffUDPServerTb4b4b4(Te6edf3addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3udp_server
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3udp_serverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3job_thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffpeer_jobsTb4b4b4)
Te6edf3job_threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3job_threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Te6edf3peering_waitTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True


Tff7b72def Td2a8ffdiscovery_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3socketTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72def Td2a8ffannounce_loopTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_handlerTb4b4b4(Te6edf3ifnameTb4b4b4)
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3announce_loopTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3dataTb4b4b4, Te6edf3ipv6_src Tff7b72= Te6edf3socketTff7b72.Td2a8ffrecvfromTb4b4b4(T79c0ff1024Tb4b4b4)
Te6edf3expected_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTff7b72+Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3data Tff7b72== Te6edf3expected_hashTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffadd_peerTb4b4b4(Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Te6edf3ifnameTb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received peering packet on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff from Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ipv6_srcTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff, but authentication hash was incorrect.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72def Td2a8ffpeer_jobsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeer_job_intervalTb4b4b4)
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Te6edf3timed_out_peers Tff7b72= Tb4b4b4[Tb4b4b4]

T8b949e# Check for timed out peers
Tff7b72for Te6edf3peer_addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Te6edf3peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peer_addrTb4b4b4]
Te6edf3last_heard Tff7b72= Te6edf3peerTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72if Te6edf3now Tff7b72> Te6edf3last_heardTff7b72+Tff7b72selfTff7b72.Td2a8ffpeering_timeoutTb4b4b4:
Te6edf3timed_out_peersTff7b72.Td2a8ffappendTb4b4b4(Te6edf3peer_addrTb4b4b4)

T8b949e# Remove any timed out peers
Tff7b72for Te6edf3peer_addr Tff7b72in Te6edf3timed_out_peersTb4b4b4:
Te6edf3removed_peer Tff7b72= Tff7b72selfTff7b72.Td2a8ffpeersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3peer_addrTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff removed peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3peer_addrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3removed_peerTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Tff7b72for Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
T8b949e# Check that the link-local address has not changed
Tff7b72tryTb4b4b4:
Te6edf3addresses Tff7b72= Tff7b72selfTff7b72.Td2a8fflist_addressesTb4b4b4(Te6edf3ifnameTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6 Tff7b72in Te6edf3addressesTb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72None
Tff7b72for Te6edf3address Tff7b72in Te6edf3addressesTb4b4b4[Tff7b72selfTff7b72.Td2a8ffnetinfoTff7b72.Td2a8ffAF_INET6Tb4b4b4]Tb4b4b4:
Tff7b72if Ta5d6ff"Ta5d6ffaddrTa5d6ff" Tff7b72in Te6edf3addressTb4b4b4:
Tff7b72if Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6fffe80:Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3link_local_addr Tff7b72= Tff7b72selfTff7b72.Td2a8ffdescope_linklocalTb4b4b4(Te6edf3addressTb4b4b4[Ta5d6ff"Ta5d6ffaddrTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3link_local_addr Tff7b72!= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]Tb4b4b4:
Te6edf3old_link_local_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffReplacing link-local address Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3old_link_local_addressTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff with Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3link_local_addrTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3link_local_addr
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffappendTb4b4b4(Te6edf3link_local_addrTb4b4b4)

Tff7b72if Te6edf3old_link_local_address Tff7b72in Tff7b72selfTff7b72.Td2a8fflink_local_addressesTb4b4b4:
Tff7b72selfTff7b72.Td2a8fflink_local_addressesTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3old_link_local_addressTb4b4b4)

Te6edf3local_addr Tff7b72= Te6edf3link_local_addrTff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Te6edf3ifname
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3local_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3listen_address Tff7b72= Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]

Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffShutting down previous UDP listener for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3previous_server Tff7b72= Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4]
Tff7b72def Td2a8ffshutdown_serverTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3previous_serverTff7b72.Td2a8ffshutdownTb4b4b4(Tb4b4b4)
Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3shutdown_serverTb4b4b4, Te6edf3daemonTff7b72=Tff7b72TrueTb4b4b4)Tff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffStarting new UDP listener for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)

Te6edf3udp_server Tff7b72= Te6edf3socketserverTff7b72.Td2a8ffUDPServerTb4b4b4(Te6edf3listen_addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffhandler_factoryTb4b4b4(Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffinterface_serversTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3udp_server

Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Te6edf3udp_serverTff7b72.Td2a8ffserve_foreverTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not get device information while updating link-local addresses for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

T8b949e# Check multicast echo timeouts
Te6edf3last_multicast_echo Tff7b72= T79c0ff0
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4:
Te6edf3last_multicast_echo Tff7b72= Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4]

Tff7b72if Te6edf3now Tff7b72- Te6edf3last_multicast_echo Tff7b72> Tff7b72selfTff7b72.Td2a8ffmulticast_echo_timeoutTb4b4b4:
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffMulticast echo timeout for Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Carrier lost.Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Tff7b72True
Tff7b72elseTb4b4b4:
Tff7b72if Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcarrier_changed Tff7b72= Tff7b72True
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Carrier recovered on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Tff7b72False

Tff7b72def Td2a8ffannounce_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72while Tff7b72TrueTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeer_announceTb4b4b4(Te6edf3ifnameTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffannounce_intervalTb4b4b4)
Tff7b72def Td2a8ffpeer_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3link_local_address Tff7b72= Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4]
Te6edf3discovery_token Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Tff7b72selfTff7b72.Td2a8ffgroup_idTff7b72+Te6edf3link_local_addressTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3announce_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Tff7b72selfTff7b72.Td2a8ffmcast_discovery_addressTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdiscovery_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)

Te6edf3ifis Tff7b72= Te6edf3structTff7b72.Td2a8ffpackTb4b4b4(Ta5d6ff"Ta5d6ffITa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffsetsockoptTb4b4b4(Te6edf3socketTff7b72.Td2a8ffIPPROTO_IPV6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffIPV6_MULTICAST_IFTb4b4b4, Te6edf3ifisTb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffsendtoTb4b4b4(Te6edf3discovery_tokenTb4b4b4, Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)
Te6edf3announce_socketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72if Tb4b4b4(Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfaces Tff7b72and Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72== Tff7b72FalseTb4b4b4) Tff7b72or Tff7b72not Te6edf3ifname Tff7b72in Tff7b72selfTff7b72.Td2a8fftimed_out_interfacesTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff Detected possible carrier loss on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72pass

Tff7b72def Td2a8ffadd_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addrTb4b4b4, Te6edf3ifnameTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8fflink_local_addressesTb4b4b4:
Te6edf3ifname Tff7b72= Tff7b72None
Tff7b72for Te6edf3interface_name Tff7b72in Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffadopted_interfacesTb4b4b4[Te6edf3interface_nameTb4b4b4] Tff7b72== Te6edf3addrTb4b4b4:
Te6edf3ifname Tff7b72= Te6edf3interface_name

Tff7b72if Te6edf3ifname Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmulticast_echoesTb4b4b4[Te6edf3ifnameTb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff received multicast echo on unexpected interface Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4)

Tff7b72elseTb4b4b4:
Tff7b72if Tff7b72not Te6edf3addr Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3addrTb4b4b4] Tff7b72= Tb4b4b4[Te6edf3ifnameTb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4]
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff added peer Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3addrTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3ifnameTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffrefresh_peerTb4b4b4(Te6edf3addrTb4b4b4)

Tff7b72def Td2a8ffrefresh_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3addrTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3addrTb4b4b4]Tb4b4b4[T79c0ff1Tb4b4b4] Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Te6edf3data_hash Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffull_hashTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3deque_hit Tff7b72= Tff7b72False
Tff7b72if Te6edf3data_hash Tff7b72in Tff7b72selfTff7b72.Td2a8ffmif_dequeTb4b4b4:
Tff7b72for Te6edf3te Tff7b72in Tff7b72selfTff7b72.Td2a8ffmif_deque_timesTb4b4b4:
Tff7b72if Te6edf3teTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72== Te6edf3data_hash Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72< Te6edf3teTb4b4b4[T79c0ff1Tb4b4b4]Tff7b72+Te6edf3AutoInterfaceTff7b72.Td2a8ffMULTI_IF_DEQUE_TTLTb4b4b4:
Te6edf3deque_hit Tff7b72= Tff7b72True
Tff7b72break

Tff7b72if Tff7b72not Te6edf3deque_hitTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmif_dequeTff7b72.Td2a8ffappendTb4b4b4(Te6edf3data_hashTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmif_deque_timesTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4[Te6edf3data_hashTb4b4b4, Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)

Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4,Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3peer Tff7b72in Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffoutbound_udp_socket Tff7b72== Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffoutbound_udp_socket Tff7b72= Te6edf3socketTff7b72.Td2a8ffsocketTb4b4b4(Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)

Te6edf3peer_addr Tff7b72= Tffa657strTb4b4b4(Te6edf3peerTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff%Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTff7b72.Td2a8ffinterface_name_to_indexTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpeersTb4b4b4[Te6edf3peerTb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3addr_info Tff7b72= Te6edf3socketTff7b72.Td2a8ffgetaddrinfoTb4b4b4(Te6edf3peer_addrTb4b4b4, Tff7b72selfTff7b72.Td2a8ffdata_portTb4b4b4, Te6edf3socketTff7b72.Td2a8ffAF_INET6Tb4b4b4, Te6edf3socketTff7b72.Td2a8ffSOCK_DGRAMTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffoutbound_udp_socketTff7b72.Td2a8ffsendtoTb4b4b4(Te6edf3dataTb4b4b4, Te6edf3addr_infoTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff4Tb4b4b4]Tb4b4b4)

Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffCould not transmit on Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Tff7b72selfTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. The contained exception was: Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

T8b949e# Until per-device sub-interfacing is implemented,
T8b949e# ingress limiting should be disabled on AutoInterface
Tff7b72def Td2a8ffshould_ingress_limitTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72False

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffAutoInterface[Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffnameTff7b72+Ta5d6ff"Ta5d6ff]Ta5d6ff"

Tff7b72class T56d364AutoInterfaceHandlerTb4b4b4(Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3callbackTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffcallback Tff7b72= Te6edf3callback
Te6edf3socketserverTff7b72.Td2a8ffBaseRequestHandlerTff7b72.Td2a8ff__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3keysTb4b4b4)

Tff7b72def Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3data Tff7b72= Tff7b72selfTff7b72.Td2a8ffrequestTb4b4b4[T79c0ff0Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffcallbackTb4b4b4(Te6edf3dataTb4b4b4)

Served by rngit 1.5.2 - Generated in 0.11s